home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / text / hyper / Guideance.lha / Guideance.e < prev    next >
Text File  |  1996-11-03  |  10KB  |  350 lines

  1. /*
  2. Guideance - display XPK/PP-crunched AmigaGuides
  3. *---------------------------------------------*
  4.  
  5. Program history:
  6. *--------------*
  7.  
  8. 5.12.94 
  9. *-----*
  10. - first version (no optimizations, but does already do work)
  11.  
  12. 8.12.94
  13. *-----*
  14. - used some subroutines instead of one big bunch of E
  15.  
  16. 20.4.95
  17. *-----*
  18. - renamed the proggy from "GoGuide" to "Guideance"
  19. - cleaned up the code a little
  20. - improved PubScreen-handling
  21.  
  22. 1.4.96
  23. *----*
  24. (kein Aprilscherz)
  25. - enhanced PubScreen-handling again. Now Guideance either opens on a
  26.   new public screen with the specified name or (if the named public screen
  27.   already exists) opens its window on the named public screen
  28. - Some more tiny improvements.
  29. - Fell back to the traditional version scheme.
  30. - Still no error output, dunno if I'll ever do that.
  31.  
  32. 22.10.96
  33. *------*
  34. - added PowerGuide-support (a premiere on the Amiga I think, WOW ;)
  35. - cleaned up here and there
  36. - error handling
  37. - "boosted" executable from 2736 to 4636 bytes :)
  38. - yet to be tested and fixed
  39.  
  40. 23.10.96
  41. *------*
  42. -fixed an old and perhaps deadly bug in the decrunching routine ... oh my.
  43.  
  44. 26.10.96
  45. *------*
  46. - cleaned it up a whole lot - the only wierd and pretty illogical routine left is the tiny
  47.   assembly stuff to change the temp-filename if it already is in use
  48. - should be ready for release now, although I still need to write some docs
  49.  
  50. 28.10.96
  51. *------*
  52. - jeez, I still have problems with ReadArgs - fixed
  53. - and some more fixes
  54.  
  55. 30.10.96
  56. *------*
  57. - removed error message for NOFR (could be annoying to users)
  58. - jipee, PowerGuide 1.21 doesn't crash on textfiles anymore - this should make guideance
  59.   a must-download ;)
  60.  
  61. 2.11.96
  62. *-----*
  63. - small clean-ups, added simple WB-support
  64.  
  65. 3.11.96
  66. *-----*
  67. - fixed problems with the depth-argument
  68.  
  69. */
  70.  
  71. OPT OSVERSION=39 -> force people to upgrade (needed for SA_LIKEWORKBENCH)
  72.  
  73. MODULE 'xpk','libraries/xpk','amigaguide','libraries/amigaguide','reqtools','libraries/reqtools','dos/dos',
  74.        'intuition/screens','intuition/intuition','graphics/videocontrol','graphics/view','workbench/startup'
  75.  
  76. ENUM FROM=0,PUBSCREEN,PSW,PSH,DEPTH,POWERGUIDE -> the arguments
  77. ENUM NOERR=42,BADARGS,NORTLIB,NOALLOCFR,NOFR,NOLOCK,NOSCREEN,NOLOCKPS,NOOPEN,NOREAD,NOXPKLIB,XPKIOERR,XPKERR,NOAMIGAGUIDELIB,NOAMIGAGUIDE,NOPOWERGUIDE -> the error messages
  78.  
  79. DEF myargs[6]:ARRAY OF LONG, -> number of arguments
  80.         filename[108]:STRING, -> i.e. STRINGS are NULL-terminated, ARRAYS are not
  81.         dir[256]:STRING, -> well, for someone who likes to nest his/her directories ...
  82.         wb:PTR TO wbstartup,args:PTR TO wbarg
  83.  
  84. PROC main() HANDLE
  85. DEF rdargs=NIL,lock=NIL,oldlock,ver,i
  86.  
  87.     ver:='$VER: Guideance 1.0 (3.11.96) by Ralph Debusmann'
  88.  
  89.     myargs:=[NIL,NIL,NIL,NIL,NIL,NIL]
  90.  
  91.     IF (wb:=wbmessage)=NIL
  92.         IF (rdargs:=ReadArgs('FROM,PS=PUBSCREEN/K,PSW=PUBSCREENWIDTH/N,PSH=PUBSCREENHEIGHT/N,DEPTH/N,PG=POWERGUIDE/S',myargs,NIL))=NIL THEN Raise(BADARGS)
  93.         IF myargs[FROM]=NIL
  94.             rtfilereq('Guideance')
  95.             IF (lock:=Lock(dir,ACCESS_READ))=NIL THEN Raise(NOLOCK)
  96.             oldlock:=CurrentDir(lock)
  97.             openag(filename)
  98.             CurrentDir(oldlock)
  99.             UnLock(lock)
  100.             lock:=NIL
  101.         ELSE
  102.             openag(myargs[FROM])
  103.         ENDIF
  104.     ELSE
  105.         args:=wb.arglist
  106.         IF (wb.numargs<=1)
  107.             rtfilereq('Guideance')
  108.             IF (lock:=Lock(dir,ACCESS_READ))=NIL THEN Raise(NOLOCK)
  109.             oldlock:=CurrentDir(lock)
  110.             openag(filename)
  111.             CurrentDir(oldlock)
  112.             UnLock(lock)
  113.             lock:=NIL
  114.         ELSE
  115.             FOR i:=1 TO (wb.numargs-1) -> open multiple files one after the other
  116.                 oldlock:=CurrentDir(args[i].lock)
  117.                 openag(args[i].name)
  118.                 CurrentDir(oldlock)
  119.                 lock:=NIL
  120.             ENDFOR
  121.         ENDIF
  122.     ENDIF
  123.  
  124.     Raise(NOERR)
  125.  
  126. EXCEPT
  127.     IF rdargs THEN FreeArgs(rdargs)
  128.     IF lock THEN UnLock(lock)
  129.     SELECT exception
  130.         CASE BADARGS
  131.             errormsg('Bad arguments.')
  132.         CASE NOLOCK
  133.             errormsg('Error Lock()ing file.')
  134.     ENDSELECT
  135. ENDPROC
  136.  
  137. /*******************************************************************************/
  138.  
  139. /*
  140. Output error message
  141. *------------------*
  142.  
  143. arguments: textformat
  144.  
  145. */
  146.  
  147. PROC errormsg(textformat)
  148.  
  149.     EasyRequestArgs(NIL,[20,0,'Guideance',textformat,'Cancel'],0,0)
  150. ENDPROC
  151.  
  152. /*******************************************************************************/
  153.  
  154. /*
  155. Output message
  156. *------------*
  157.  
  158. arguments: textformat
  159.  
  160. */
  161.  
  162. PROC msg(textformat)
  163.  
  164.     EasyRequestArgs(NIL,[20,0,'Guideance',textformat,'Ok'],0,0)
  165. ENDPROC
  166.  
  167. /*******************************************************************************/
  168.  
  169. /*
  170. Reqtools-Filerequester
  171. *--------------------*
  172.  
  173. arguments: title
  174. used global variables: filename, dir
  175.  
  176. */
  177.  
  178. PROC rtfilereq(title) HANDLE
  179. DEF filereq:PTR TO rtfilerequester
  180.  
  181.     filereq:=NIL
  182.  
  183.     IF (reqtoolsbase:=OpenLibrary('reqtools.library',0))=NIL THEN Raise(NORTLIB)
  184.     IF (filereq:=RtAllocRequestA(RT_FILEREQ,NIL))=NIL THEN Raise(NOALLOCFR)
  185.     IF (RtFileRequestA(filereq,filename,title,NIL))=FALSE THEN Raise(NOFR) ELSE StrCopy(dir,filereq.dir,ALL)
  186.  
  187.     IF filereq THEN RtFreeRequest(filereq)
  188.     IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
  189.  
  190. EXCEPT
  191.     IF filereq THEN RtFreeRequest(filereq)
  192.     IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
  193.     SELECT exception
  194.         CASE NORTLIB
  195.             errormsg('Error opening reqtools.library')
  196.         CASE NOALLOCFR
  197.             errormsg('Error allocating filerequester.')
  198.         CASE NOFR
  199. ->            errormsg('Either error opening filerequester or cancelled req.')
  200.     ENDSELECT
  201.     ReThrow()
  202. ENDPROC
  203.  
  204. /*******************************************************************************/
  205.  
  206. /*
  207. view AmigaGuide-document
  208. *----------------------*
  209.  
  210. arguments: filename
  211.  
  212. */
  213.  
  214. PROC openag(filename) HANDLE
  215. DEF file,buffer[4]:STRING, -> for checking out the file identity (XPK, PP or unpacked)
  216.         xpkoutname[32]:STRING, -> name of temporary unpacked file in T:
  217.         aghandle,ret,screen:PTR TO screen,
  218.         pubscreen,psw=0,psh=0,depth=0,
  219.         command[256]:STRING, -> pretty long for safety reasons, length of SystemTagList-command-argument
  220.         xpkioerr=FALSE,xpkout=FALSE,xpkret=FALSE,xpkerrstring[50]:STRING
  221.  
  222.     ret:=FALSE
  223.  
  224.     pubscreen:=myargs[PUBSCREEN]
  225.     IF (myargs[PSW]<>NIL) THEN psw:=Long(myargs[PSW])
  226.     IF (myargs[PSH]<>NIL) THEN psh:=Long(myargs[PSH])
  227.     IF (myargs[DEPTH]<>NIL) THEN depth:=Long(myargs[DEPTH])
  228.  
  229. -> shitty code follows
  230.  
  231.     IF pubscreen OR depth OR psw OR psh -> PubScreen or depth or width/height given?
  232.         IF (depth<0)
  233.             msg('Please check your DEPTH-argument.\nDEPTH=2 used.')
  234.             depth:=2
  235.         ENDIF
  236.         IF (depth=0) THEN depth:=2
  237.         IF (psw<100) AND (psw<>0)
  238.             msg('Please check your PUBLICSCREENWIDTH-argument.\nPUBLICSCREENWIDTH=0 used (-> WB value).')
  239.             psw:=0
  240.         ENDIF
  241.         IF (psh<100) AND (psh<>0)
  242.             msg('Please check your PUBLICSCREENHEIGHT-argument.\nPUBLICSCREENHEIGHT=0 used (-> WB value).')
  243.             psh:=0
  244.         ENDIF
  245.         IF (pubscreen=NIL) THEN pubscreen:='Guideance' -> at the moment thus only one screen can be opened at a time if the name of the pubscreen is NOT given
  246.         IF (screen:=LockPubScreen(pubscreen))=NIL
  247.             IF (psw=0) AND psh
  248.                 IF (screen:=OpenScreenTagList(NIL,[SA_PUBNAME,pubscreen,SA_LIKEWORKBENCH,TRUE,
  249.                         SA_HEIGHT,psh,SA_DEPTH,depth,NIL]))=NIL THEN Raise(NOSCREEN)
  250.                 PubScreenStatus(screen,0) -> make our screen a public one
  251.                 IF LockPubScreen(pubscreen)=NIL THEN Raise(NOLOCKPS) -> and lock it
  252.             ELSEIF psw AND (psh=0)
  253.                 IF (screen:=OpenScreenTagList(NIL,[SA_PUBNAME,pubscreen,SA_LIKEWORKBENCH,TRUE,
  254.             SA_WIDTH,psw,SA_DEPTH,depth,NIL]))=NIL THEN Raise(NOSCREEN)
  255.                 PubScreenStatus(screen,0)
  256.                 IF LockPubScreen(pubscreen)=NIL THEN Raise(NOLOCKPS)
  257.             ELSEIF psw AND psh
  258.                 IF (screen:=OpenScreenTagList(NIL,[SA_PUBNAME,pubscreen,SA_LIKEWORKBENCH,TRUE,
  259.             SA_WIDTH,psw,SA_HEIGHT,psh,SA_DEPTH,depth,NIL]))=NIL THEN Raise(NOSCREEN)
  260.                 PubScreenStatus(screen,0)
  261.                 IF LockPubScreen(pubscreen)=NIL THEN Raise(NOLOCKPS)
  262.             ELSE
  263.                 IF (screen:=OpenScreenTagList(NIL,[SA_PUBNAME,pubscreen,SA_LIKEWORKBENCH,TRUE,
  264.             SA_DEPTH,depth,NIL]))=NIL THEN Raise(NOSCREEN)
  265.                 PubScreenStatus(screen,0)
  266.                 IF LockPubScreen(pubscreen)=NIL THEN Raise(NOLOCKPS)
  267.             ENDIF
  268.         ELSE
  269.             ScreenToFront(screen) -> throw the screen to the front on which we'd like to open our window
  270.         ENDIF
  271.     ELSE
  272.         screen:=NIL -> no screen opened or opened on
  273.         pubscreen:=NIL -> open on default PubScreen (i.e. WB)
  274.     ENDIF
  275.  
  276.     IF (file:=Open(filename,MODE_OLDFILE))=NIL THEN Raise(NOOPEN)
  277.     IF (Read(file,buffer,4))=-1 THEN Raise(NOREAD)
  278.     Close(file)
  279.  
  280.     IF (StrCmp('XPKF',buffer,4)) OR (StrCmp('PP20',buffer,4))
  281.         IF (xpkbase:=OpenLibrary('xpkmaster.library',0))=NIL THEN Raise(NOXPKLIB)
  282.         xpkoutname:='T:Guideance.temp0'
  283.         WHILE ((xpkret:=XpkUnpack([XPK_INNAME,filename,XPK_OUTNAME,xpkoutname,0]))=XPKERR_IOERROUT) AND (xpkioerr=FALSE)
  284.  
  285. -> just take this wierd and unnecessary piece of assembly as it is ... absolutely unportable ;)
  286.  
  287.             MOVE.L xpkoutname,A0
  288.             LEA 16(A0),A0 -> i.e. the number ("0" initially) at the end of "xpkoutname"
  289.             ADDQ.B #1,(A0)
  290.             CMP.B #$3a,(A0) -> one character after "9" in the ascii-table
  291.             BLT.S under10
  292.             xpkioerr:=TRUE
  293. under10:
  294.         ENDWHILE
  295.  
  296.         IF (xpkioerr=TRUE) THEN Raise(XPKIOERR)
  297.  
  298.         IF (xpkret<0) THEN Throw(XPKERR,xpkret)
  299.  
  300.         xpkout:=TRUE
  301.  
  302.         filename:=xpkoutname
  303.     ENDIF
  304.  
  305.     IF (myargs[POWERGUIDE]=NIL)
  306.         IF (amigaguidebase:=OpenLibrary('amigaguide.library',0))=NIL THEN Raise(NOAMIGAGUIDELIB)
  307.         IF (aghandle:=OpenAmigaGuideA([NIL,filename,NIL,pubscreen,NIL,NIL,NIL,0,NIL,NIL,0,NIL,NIL],0))=NIL THEN Raise(NOAMIGAGUIDE)
  308.         CloseAmigaGuide(aghandle)
  309.     ELSE
  310.         IF pubscreen
  311.             StringF(command,'PowerGuide "\s" PUBSCREEN="\s"',filename,pubscreen)
  312.         ELSE
  313.             StringF(command,'PowerGuide "\s"',filename)
  314.         ENDIF
  315.         IF (SystemTagList(command,NIL)<>0) THEN Raise(NOPOWERGUIDE)
  316.     ENDIF
  317.  
  318.     Raise(NOERR)
  319.  
  320. EXCEPT
  321.     IF screen THEN UnlockPubScreen(NIL,screen)
  322.     IF xpkbase THEN CloseLibrary(xpkbase)
  323.     IF xpkout THEN DeleteFile(xpkoutname)
  324.     IF amigaguidebase THEN CloseLibrary(amigaguidebase)
  325.     IF screen AND (screen.firstwindow=NIL) THEN CloseScreen(screen)
  326.     SELECT exception
  327.         CASE NOSCREEN
  328.             errormsg('Error opening PublicScreen.')
  329.         CASE NOLOCKPS
  330.             errormsg('Error locking PublicScreen.')
  331.         CASE NOOPEN
  332.             errormsg('Error opening file.')
  333.         CASE NOREAD
  334.             errormsg('Error reading file.')
  335.         CASE NOXPKLIB
  336.             errormsg('Error opening xpkmaster.library.')
  337.         CASE XPKIOERR
  338.             errormsg('Error decrunching file\nOnly 10 crunched Guides may be open simultaneously.')
  339.         CASE XPKERR
  340.             StringF(xpkerrstring,'Error decrunching file. (XPK-error No. \d)',exceptioninfo)
  341.             errormsg(xpkerrstring)
  342.         CASE NOAMIGAGUIDELIB
  343.             errormsg('Error opening amigaguide.library.')
  344.         CASE NOAMIGAGUIDE
  345.             errormsg('Error opening AmigaGuide.')
  346.         CASE NOPOWERGUIDE
  347.             errormsg('Error spawning PowerGuide - it *must* be in your path.')
  348.     ENDSELECT
  349. ENDPROC
  350.